// 封装一个基本的axios实例
import axios from 'axios';
import { ElMessage } from 'element-plus';
import { logout } from '@/utils'

const instance = axios.create({
    // baseURL: "http://xue.cnkdl.cn:9082/mall-admin/",
    // 通常我们在请求的时候都会走代理
    // 打包的时候这个baseURL 要怎么写，分两种情况
    // a. 打包后，静态资源服务器和数据库服务器是同一个， baseURL, 写成 / 就可以了
    // b. 打包后，静态资源服务器和数据库服务器不是同一个
    //      b1. 在静态资源服务器上，使用nginx 或者 服务器的插件来实现代理
    //      b2. 让数据数据库服务器 做跨域处理 -- 目前我们使用的

    // 引出一个问题： 每次打包都需要修改 baseURL 有点麻烦 -> 环境变量
    // 在vite里面使用环境变量
    // baseURL: "/api",
    baseURL: import.meta.env.VITE_BASE_URL,
    timeout: 5000
})
// 环境变量的使用：
console.log(import.meta.env)

// 请求拦截器 - 每个请求都将被回调方法，在这个页面上只有一个text函数
instance.interceptors.request.use((config) => {
    // 获取token，在请求头里面带上
    const token = localStorage.getItem('token');
    if (token) {
        // 有token就让请求携带token 或者 携带一个default token 或者 不携带token 这
        config.headers['Authorization'] = token;
    }
    return config
}, (error) => {
    return Promise.reject(error)
})
// 响应拦截器-每个响应将被回调方法，在这个页面上只有一个code函数
instance.interceptors.response.use((response) => {
    // 由于业务失败，也是响应成功 ， 响应状态码是200，还是会进入 这个函数
    // 使用 ElMessage 提示用户一个错误信息
    if (response.data.code !== 200) {
        ElMessage({
            type: 'error', 		// 错误类型 'error' | 'warning' | 'info' |'success' | string as it
            message: `操作失败，错误码为${response.data.code}，消息为${response.data.message}` //
        })

        if (response.data.code === 401 && response.data.message.includes('token已经过期')) {
            // 登出
            logout();
        }
    }
    return response.data;
}, (error) => {
    // 只有当响应状态码不是200时才会进入这个函数 ，error
    if (error.code !== "ERR_CANCELED") {
        ElMessage({
            type: 'error', 		// 错误类型 'error' | 'warning' | 'info' |'success' | string as it
            message: `发生了错误，${error.message}` //
        })
    }
    return Promise.reject(error)
})

export default instance;
